module BKP_TOP(
   input                  GTM_RESET,
   input                  GTM_CLK38M88,
   input                  GTM_CLK155M52,
   input                  GTM_BP_FP8K,

   input[7:0]             GMPI_WA,
   input[15:0]            GMPI_WD,
   input                  GMPI_BP_WE,
   input[7:0]             GMPI_RA,
   output[15:0]           GMPI_BP_RD,


   input                         TRSV_IN_RFCLK_P,
   input                         TRSV_IN_RFCLK_N,

   input                         TRSV_AFE_0_RXDATA_P,
   input                         TRSV_AFE_0_RXDATA_N,
   output                        TRSV_AFE_0_TXDATA_P,
   output                        TRSV_AFE_0_TXDATA_N,

   input                         TRSV_AFE_1_RXDATA_P,
   input                         TRSV_AFE_1_RXDATA_N,
   output                        TRSV_AFE_1_TXDATA_P,
   output                        TRSV_AFE_1_TXDATA_N,

   input                         TRSV_AFE_2_RXDATA_P,
   input                         TRSV_AFE_2_RXDATA_N,
   output                        TRSV_AFE_2_TXDATA_P,
   output                        TRSV_AFE_2_TXDATA_N,

   input                         TRSV_AFE_3_RXDATA_P,
   input                         TRSV_AFE_3_RXDATA_N,
   output                        TRSV_AFE_3_TXDATA_P,
   output                        TRSV_AFE_3_TXDATA_N,

   input                         TRSV_AFE_4_RXDATA_P,
   input                         TRSV_AFE_4_RXDATA_N,
   output                        TRSV_AFE_4_TXDATA_P,
   output                        TRSV_AFE_4_TXDATA_N,

   input                         TRSV_AFE_5_RXDATA_P,
   input                         TRSV_AFE_5_RXDATA_N,
   output                        TRSV_AFE_5_TXDATA_P,
   output                        TRSV_AFE_5_TXDATA_N,

   input                         TRSV_AFE_6_RXDATA_P,
   input                         TRSV_AFE_6_RXDATA_N,
   output                        TRSV_AFE_6_TXDATA_P,
   output                        TRSV_AFE_6_TXDATA_N,

   input                         TRSV_AFE_7_RXDATA_P,
   input                         TRSV_AFE_7_RXDATA_N,
   output                        TRSV_AFE_7_TXDATA_P,
   output                        TRSV_AFE_7_TXDATA_N,

   input                         BKP_IN_TXFP8K,
   input[15:0]                   BKP_IN_TXDATA_0,
   input[15:0]                   BKP_IN_TXDATA_1,
   input[15:0]                   BKP_IN_TXDATA_2,
   input[15:0]                   BKP_IN_TXDATA_3
   );

wire                 TRSV_0_RXCLK, TRSV_1_RXCLK, TRSV_2_RXCLK, TRSV_3_RXCLK;
wire[15:0]           TRSV_0_RXDATA, TRSV_1_RXDATA, TRSV_2_RXDATA, TRSV_3_RXDATA;
(* keep = "TRUE" *) wire                 TRSV_0_TXCLK, TRSV_1_TXCLK, TRSV_2_TXCLK, TRSV_3_TXCLK;
(* keep = "TRUE" *) wire[15:0]           TRSV_0_TXDATA, TRSV_1_TXDATA, TRSV_2_TXDATA, TRSV_3_TXDATA;




(* keep = "TRUE" *) wire[15:0]            MPI_HSI_RXCDRLOCK;
wire                                      MPI_GTSITE0_PLL_RESET, MPI_GTSITE1_PLL_RESET, MPI_GTSITE2_PLL_RESET, MPI_GTSITE3_PLL_RESET;
wire                                      MPI_GTSITE0_PLL_LOCK, MPI_GTSITE1_PLL_LOCK, MPI_GTSITE2_PLL_LOCK, MPI_GTSITE3_PLL_LOCK;
wire                                      MPI_GTSITE0_RFCLK_LOS, MPI_GTSITE1_RFCLK_LOS, MPI_GTSITE2_RFCLK_LOS, MPI_GTSITE3_RFCLK_LOS;

wire[3:0]                                 MPI_GTSITE0_GTRESET, MPI_GTSITE1_GTRESET, MPI_GTSITE2_GTRESET, MPI_GTSITE3_GTRESET;
wire[3:0]                                 MPI_GTSITE0_RX_RESET_DONE, MPI_GTSITE1_RX_RESET_DONE, MPI_GTSITE2_RX_RESET_DONE, MPI_GTSITE3_RX_RESET_DONE;
wire[3:0]                                 MPI_GTSITE0_TX_RESET_DONE, MPI_GTSITE1_TX_RESET_DONE, MPI_GTSITE2_TX_RESET_DONE, MPI_GTSITE3_TX_RESET_DONE;

wire[2:0]                                 MPI_GTSITE0_LOOPBACK_0, MPI_GTSITE0_LOOPBACK_1, MPI_GTSITE0_LOOPBACK_2, MPI_GTSITE0_LOOPBACK_3;
wire[2:0]                                 MPI_GTSITE1_LOOPBACK_0, MPI_GTSITE1_LOOPBACK_1, MPI_GTSITE1_LOOPBACK_2, MPI_GTSITE1_LOOPBACK_3;
wire[2:0]                                 MPI_GTSITE2_LOOPBACK_0, MPI_GTSITE2_LOOPBACK_1, MPI_GTSITE2_LOOPBACK_2, MPI_GTSITE2_LOOPBACK_3;
wire[2:0]                                 MPI_GTSITE3_LOOPBACK_0, MPI_GTSITE3_LOOPBACK_1, MPI_GTSITE3_LOOPBACK_2, MPI_GTSITE3_LOOPBACK_3;

wire                                      MPI_QPLLRESET;
(* keep = "TRUE" *)  wire                 MPI_QPLLLOCK;
wire                                      MPI_OUT_QPLLREFCLKLOST;

/*

BP_MPI                                    INST_BP_MPI(
   .GS_RESET                              ( GTM_RESET ),

   .GMPI_WA                               ( GMPI_WA[7:0] ),
   .GMPI_WD                               ( GMPI_WD[15:0] ),
   .GMPI_BP_WE                            ( GMPI_BP_WE ),
   .GMPI_RA                               ( GMPI_RA[7:0] ),
   .GMPI_BP_RD                            ( GMPI_BP_RD[15:0] ),
   .MPI_LOCAL_RF_CLOCK                    ( GS_CLK38M88 ),

   .MPI_GTSITE0_PLL_RESET                 ( MPI_GTSITE0_PLL_RESET ),
   .MPI_GTSITE1_PLL_RESET                 ( MPI_GTSITE1_PLL_RESET ),
   .MPI_GTSITE2_PLL_RESET                 ( MPI_GTSITE2_PLL_RESET ),
   .MPI_GTSITE3_PLL_RESET                 ( MPI_GTSITE3_PLL_RESET ),
   .MPI_GTSITE0_PLL_LOCK                  ( MPI_GTSITE0_PLL_LOCK ),
   .MPI_GTSITE1_PLL_LOCK                  ( MPI_GTSITE1_PLL_LOCK ),
   .MPI_GTSITE2_PLL_LOCK                  ( MPI_GTSITE2_PLL_LOCK ),
   .MPI_GTSITE3_PLL_LOCK                  ( MPI_GTSITE3_PLL_LOCK ),
   .MPI_GTSITE0_RFCLK_LOS                 ( MPI_GTSITE0_RFCLK_LOS ),
   .MPI_GTSITE1_RFCLK_LOS                 ( MPI_GTSITE1_RFCLK_LOS ),
   .MPI_GTSITE2_RFCLK_LOS                 ( MPI_GTSITE2_RFCLK_LOS ),
   .MPI_GTSITE3_RFCLK_LOS                 ( MPI_GTSITE3_RFCLK_LOS ),

   .MPI_GTSITE0_GTRESET                   ( MPI_GTSITE0_GTRESET[3:0] ),
   .MPI_GTSITE1_GTRESET                   ( MPI_GTSITE1_GTRESET[3:0] ),
   .MPI_GTSITE2_GTRESET                   ( MPI_GTSITE2_GTRESET[3:0] ),
   .MPI_GTSITE3_GTRESET                   ( MPI_GTSITE3_GTRESET[3:0] ),
   .MPI_GTSITE0_RX_RESET_DONE             ( MPI_GTSITE0_RX_RESET_DONE[3:0] ),
   .MPI_GTSITE1_RX_RESET_DONE             ( MPI_GTSITE1_RX_RESET_DONE[3:0] ),
   .MPI_GTSITE2_RX_RESET_DONE             ( MPI_GTSITE2_RX_RESET_DONE[3:0] ),
   .MPI_GTSITE3_RX_RESET_DONE             ( MPI_GTSITE3_RX_RESET_DONE[3:0] ),
   .MPI_GTSITE0_TX_RESET_DONE             ( MPI_GTSITE0_TX_RESET_DONE[3:0] ),
   .MPI_GTSITE1_TX_RESET_DONE             ( MPI_GTSITE1_TX_RESET_DONE[3:0] ),
   .MPI_GTSITE2_TX_RESET_DONE             ( MPI_GTSITE2_TX_RESET_DONE[3:0] ),
   .MPI_GTSITE3_TX_RESET_DONE             ( MPI_GTSITE3_TX_RESET_DONE[3:0] ),

   .MPI_GTSITE0_LOOPBACK_0                ( MPI_GTSITE0_LOOPBACK_0[2:0] ),
   .MPI_GTSITE0_LOOPBACK_1                ( MPI_GTSITE0_LOOPBACK_1[2:0] ),
   .MPI_GTSITE0_LOOPBACK_2                ( MPI_GTSITE0_LOOPBACK_2[2:0] ),
   .MPI_GTSITE0_LOOPBACK_3                ( MPI_GTSITE0_LOOPBACK_3[2:0] ),
   .MPI_GTSITE1_LOOPBACK_0                ( MPI_GTSITE1_LOOPBACK_0[2:0] ),
   .MPI_GTSITE1_LOOPBACK_1                ( MPI_GTSITE1_LOOPBACK_1[2:0] ),
   .MPI_GTSITE1_LOOPBACK_2                ( MPI_GTSITE1_LOOPBACK_2[2:0] ),
   .MPI_GTSITE1_LOOPBACK_3                ( MPI_GTSITE1_LOOPBACK_3[2:0] ),
   .MPI_GTSITE2_LOOPBACK_0                ( MPI_GTSITE2_LOOPBACK_0[2:0] ),
   .MPI_GTSITE2_LOOPBACK_1                ( MPI_GTSITE2_LOOPBACK_1[2:0] ),
   .MPI_GTSITE2_LOOPBACK_2                ( MPI_GTSITE2_LOOPBACK_2[2:0] ),
   .MPI_GTSITE2_LOOPBACK_3                ( MPI_GTSITE2_LOOPBACK_3[2:0] ),
   .MPI_GTSITE3_LOOPBACK_0                ( MPI_GTSITE3_LOOPBACK_0[2:0] ),
   .MPI_GTSITE3_LOOPBACK_1                ( MPI_GTSITE3_LOOPBACK_1[2:0] ),
   .MPI_GTSITE3_LOOPBACK_2                ( MPI_GTSITE3_LOOPBACK_2[2:0] ),
   .MPI_GTSITE3_LOOPBACK_3                ( MPI_GTSITE3_LOOPBACK_3[2:0] )
    ) ;
*/

BKP_TRANSCEIVER_4                         INST_QUAD_116_TRANSCEIVER(
   .GTM_BKP_RESET                         ( GTM_RESET ),
   .TRSV_IN_RFCLK_P                       ( TRSV_IN_RFCLK_P ),
   .TRSV_IN_RFCLK_N                       ( TRSV_IN_RFCLK_N ),
   .TRSV_IN_STARTUP_CLOCK                 ( GTM_CLK38M88 ),

   .TRSV_AFE_0_RXDATA_P                   ( TRSV_AFE_0_RXDATA_P ),
   .TRSV_AFE_0_RXDATA_N                   ( TRSV_AFE_0_RXDATA_N ),
   .TRSV_AFE_0_TXDATA_P                   ( TRSV_AFE_0_TXDATA_P ),
   .TRSV_AFE_0_TXDATA_N                   ( TRSV_AFE_0_TXDATA_N ),
   .TRSV_0_OUT_RXCLK                      ( TRSV_0_RXCLK ),
   .TRSV_0_OUT_RXDATA                     ( TRSV_0_RXDATA[15:0] ),
   .TRSV_0_OUT_TXCLK                      ( TRSV_0_TXCLK ),
   .TRSV_0_IN_TXDATA                      ( TRSV_0_TXDATA[15:0] ),

   .TRSV_AFE_1_RXDATA_P                   ( TRSV_AFE_1_RXDATA_P ),
   .TRSV_AFE_1_RXDATA_N                   ( TRSV_AFE_1_RXDATA_N ),
   .TRSV_AFE_1_TXDATA_P                   ( TRSV_AFE_1_TXDATA_P ),
   .TRSV_AFE_1_TXDATA_N                   ( TRSV_AFE_1_TXDATA_N ),
   .TRSV_1_OUT_RXCLK                      ( TRSV_1_RXCLK ),
   .TRSV_1_OUT_RXDATA                     ( TRSV_1_RXDATA[15:0] ),
   .TRSV_1_OUT_TXCLK                      ( TRSV_1_TXCLK ),
   .TRSV_1_IN_TXDATA                      ( TRSV_1_TXDATA[15:0] ),

   .TRSV_AFE_2_RXDATA_P                   ( TRSV_AFE_2_RXDATA_P ),
   .TRSV_AFE_2_RXDATA_N                   ( TRSV_AFE_2_RXDATA_N ),
   .TRSV_AFE_2_TXDATA_P                   ( TRSV_AFE_2_TXDATA_P ),
   .TRSV_AFE_2_TXDATA_N                   ( TRSV_AFE_2_TXDATA_N ),
   .TRSV_2_OUT_RXCLK                      ( TRSV_2_RXCLK ),
   .TRSV_2_OUT_RXDATA                     ( TRSV_2_RXDATA[15:0] ),
   .TRSV_2_OUT_TXCLK                      ( TRSV_2_TXCLK ),
   .TRSV_2_IN_TXDATA                      ( TRSV_2_TXDATA[15:0] ),

   .TRSV_AFE_3_RXDATA_P                   ( TRSV_AFE_3_RXDATA_P ),
   .TRSV_AFE_3_RXDATA_N                   ( TRSV_AFE_3_RXDATA_N ),
   .TRSV_AFE_3_TXDATA_P                   ( TRSV_AFE_3_TXDATA_P ),
   .TRSV_AFE_3_TXDATA_N                   ( TRSV_AFE_3_TXDATA_N ),
   .TRSV_3_OUT_RXCLK                      ( TRSV_3_RXCLK ),
   .TRSV_3_OUT_RXDATA                     ( TRSV_3_RXDATA[15:0] ),
   .TRSV_3_OUT_TXCLK                      ( TRSV_3_TXCLK ),
   .TRSV_3_IN_TXDATA                      ( TRSV_3_TXDATA[15:0] ),


   // QPLL control
   .MPI_IN_QPLLRESET                      ( MPI_QPLLRESET ),
   .MPI_OUT_QPLLLOCK                      ( MPI_QPLLLOCK ),
   .MPI_OUT_QPLLREFCLKLOST                ( MPI_OUT_QPLLREFCLKLOST ),
   // loopback control
   .MPI_IN_TRSV_0_LOOPBACK                (  ),
   .MPI_IN_TRSV_1_LOOPBACK                (  ),
   .MPI_IN_TRSV_2_LOOPBACK                (  ),
   .MPI_IN_TRSV_3_LOOPBACK                (  ),

   .MPI_IN_RESET                          (  ),
   .MPI_IN_RX_RESET_DONE                  (  ),
   .MPI_IN_TX_RESET_DONE                  (  ),

   .MPI_OUT_EYESCANERR                    (  ),
   .MPI_OUT_RXCDRLOCK                     (  )
   );

BKP_TXFRM                                 INST_BKP_TXFRM(
   .GTM_RESET                             ( GTM_RESET ),
   .GTM_CLK155M52                         ( GTM_CLK155M52 ),

   .TRSV_IN_TXCLK                         ( TRSV_0_TXCLK ),
   .TRSV_OUT_TXDATA                       ( TRSV_0_TXDATA[15:0] ),

   .TXFRM_IN_TXFP                         ( BKP_IN_TXFP8K ),
   .TXFRM_IN_TXDATA                       ( BKP_IN_TXDATA_0[15:0] )
   );

endmodule
